package ewu

import scala.collection.mutable.ArrayBuffer
import ewu._
import gui._

/**
 * Eine Zuweisung stellt die Verknüpfung zwischen einem String, welcher als Name fungiert
 * sowie einem Ausruck als "rechte Seite" dar.
*/

case class Zuweisung(name: String, ausdruck: Expression) extends Anweisung {

  override def numerate(num: List[Int]) = {
    number = num
  }
  
  override def tabbate(i: Int) = {
    tabs = i
  }

  override def toString(): String = {
    (HM.numberString(number) ++ name ++ " := " ++ ausdruck.toString ++ ";\n")
  }
  
  override def toTabString: String = {
    return (HM.tabString(tabs) ++ name ++ " := " ++ ausdruck.toString ++ ";\n")
  }

  override def trace(env: Environment, aenv: ArrayEnvironment, tt: Layout, h: Int):
                                                                    (String, Boolean, Int) = {
    if(ausdruck.evaluate(env) != None)
      env.addValue(name, ausdruck.evaluate(env).get)
    return (HM.numberString(number) ++ name ++ " := " ++ ausdruck.toString ++ ";\n", true, h+1)
  }

  def propagate(assI: Anweisung): Anweisungsfolge = {
    var tmp: ArrayBuffer[Anweisung] = ArrayBuffer()

    assI match {
      case Assertion(_, expr: BoolExpression) =>
        var ass = Assertion("", expr.and_rek(expr, Name(name), ausdruck).reduce)
        ass.tabbate(tabs)
        tmp.append(ass)
        tmp.append(this)
    }

    Anweisungsfolge(tmp)
  }

  override def propagate(assV: Anweisung, assN: Anweisung): Anweisungsfolge = null

  def getVariables(a: ArrayBuffer[Name]) = {
    if(!a.contains(Name(name)))
       a.append(Name(name))
     ausdruck.getVariables(a)
  }
  
  def replaceVariable(fromVar: Name, toVar: Expression) : Unit = {
    ausdruck.replaceVariable(fromVar, toVar)
  }
  
}

 
 